#include <util_trans.h>

// 用给定函数读取字节使填满start（含）到endn（不含）区域。
void trans_read_start_end(u8_s* start_p, const u8_s* endn_p,
			  trans_read_byte_ft read_f) {
	for (u8_s* p = start_p; p < endn_p; p++) {
		*p = read_f();
	}
}

// 用给定函数发送一个字符串。
void trans_write_str(const char str_b[], trans_write_byte_ft write_f) {
	const char* p = str_b;
	while (1) {
		u32_s ch = *p;
		if (ch == '\0') {
			break;
		}
		write_f(ch);
		p++;
	}
}

// 将十六进制的4bit转化为对应的数字或字母的ASCII。
static u32_s _hex_bit_to_ch(u32_s hex_bit) {
	if (hex_bit <= 9) {
		return '0' + hex_bit;
	} else {
		return 'A' + hex_bit - 10;
	}
}

// 用给定函数发送一个32位无符号整数的十六进制数字（对应的字符串）。
// hex_len表示低多少十六进制位有效（超过8只会让高位补0），也是输出的十六进制长度。
void trans_write_uhex(u32_s n, u32_s hex_len,
		      trans_write_byte_ft write_f) {
	i32_s right_bits = hex_len << 2;
	while (right_bits) {
		right_bits -= 4;
		u32_s hex_bit = (n >> right_bits) & 0xF;
		u32_s ch = _hex_bit_to_ch(hex_bit);
		write_f(ch);
	}
}

// 用给定函数发送一个32位无符号整数的十进制数字（对应的字符串）。
void trans_write_udec(u32_s n, trans_write_byte_ft write_f) {
	char num_str_a[11];
	char* p = num_str_a + 10;
	*p = '\0';
	do {
		p--;
		*p = n % 10 + '0';
		n /= 10;
	} while (n > 0);
	trans_write_str(p, write_f);
}

// 用给定函数发送一个32位带符号整数的十进制数字（对应的字符串）。
void trans_write_idec(i32_s n, trans_write_byte_ft write_f) {
	if (n < 0) {
		write_f('-');
		n = -n;
	}
	trans_write_udec(n, write_f);
}
